SyntaxNet GPU版安装

SyntaxNet GPU版安装

安装Bazel

前提条件:JDK1.8

git clone https://github.com/bazelbuild/bazel.git
cd bazel
./compile.sh

安装好之后,将$HOME/bazel/bazel-bin/src/加入环境变量.bash_profile

PATH=$PATH:$HOME/bazel/bazel-bin/src
export PATH

安装SyntaxNet

下载syntaxnet

git clone --recursive https://github.com/tensorflow/models.git
cd models/syntaxnet/tensorflow
./configure
cd ..
bazel test syntaxnet/... util/utf8/...

这个时候你会发现有些软件需要下载,但是又无法download。好在机器还可以 wget 或 git clone下载。

下载依赖软件

models/syntaxnet/tensorflow/tensorflow/workspace.bzl 文件给出了需要 依赖的文件。最新版的syntaxnet需要依赖gmock1.7, eigen, farmhash, jpegsrc, libpng, six, re2, grpc.

url的用wget去下载;git地址用git clone下来,如果有init_submodules=True, 你需要git clone --recursive下载。commit = "xxxxx", 等下载好之后 git checkout xxxxx 到对应的版本上去。

依赖软件存放的位置

先执行 bazel build syntaxnet/... util/utf8/... 等5-6秒后ctrl-c关闭, 这个时候切换到~/.cache/bazel/_bazel_lisheng.ls/xxxxxxxx/external/ 你会发现很多文件夹,比如eigen_archive, grpc等。带有archive的文 件夹,把压缩包放在对应的文件夹内,之后解压缩,这个时候还需要从 models/syntaxnet/tensorflow/下把对应的BUILD文件拷贝过来直接命名为 BUILD (gmock的BUILD文件在 models/syntaxnet/tensorflow/google/protobuf/gmock.BUILD);不带 archive的就直接把对应的文件夹拷贝过来覆盖。

N.B. _bazel_lisheng.ls跟用户名关联,比如你是michael,对应的路径就是_bazel_michael

编译CPU版本

bazel test syntaxnet/... util/utf8/... --fetch=false

注意一定要加上 --fetch=fasle这个选项,目的就是不要让它去远程获取了。 如果一切顺利,最后测试通过就OK了。

编译GPU版本 (前提你要有GPU)

配置:

cd models/syntaxnet/tensorflow 
./configure

N.B. 不要Google Cloud相关东西,那个选项输入N。 配置一下cuda相关东西,云GPU上配置一直默认就可以了。

配置完切换到 models/syntaxnet/tools/目录下,修改一下bazel.rc文件,添加 如下命令

build:cuda --define=using_cuda=true --define=using_cuda_nvcc=true

然后:

cd /models/syntaxnet/tensorflow/third_party/gpus/cuda

修改 BUILD 文件的172行的 "cd third_party/gpus/cuda" 为 "cd tensorflow/third_party/gpus/cuda" 类似下面这个函数,不保证以后的版本会不会是172行...

cmd = if_cuda(
  # Under cuda config, create all the symbolic links to the actual cuda files
  "OUTPUTDIR=`{} -f $(@D)/../../..`; cd third_party/gpus/cuda; OUTPUTDIR=$$OUTPUTDIR ./cuda_config.sh --check;".format(readlink_command()),
  ...
)

最后:

bazel test syntaxnet/... util/utf8/... --fetch=false --config=cuda

等待编译完成吧,貌似会有个测试无法通过,但不影响最后的使用...

吐槽

内心是痛苦的,这玩意折腾了两天,网上也没有现成的方案。现记录与此希望 可以帮助到你。 编译完之后,我发现mxnet比它好多了,简单的Makefile就可以搞定所有 的编译。Google为了强推自己的工具,搞的太复杂了,先是bazel,后是 tensorflow,syntaxnet的gpu版还编译不通,估计也没指望我们用GPU吧:(

Anyway, Have Fun with SyntaxNet!

备注:

我在编译的时候,还关闭了tensorboard的编译,这个编译还需要下载很多 东西。编译sytanxnet应该不需要这个,如果遇到遇到关于tensorboard问题,把 models/syntaxnet/tensorflow/tensorflow/ 下的tensorboard文件夹移走,放 一个与syntaxnet无关的目录。

syntaxnet在使用GPU的时候,调度起了两个显卡(机器有两个显卡),一个显卡内 存全部占用,另一个只占了100MB。但观察下来,它只用全部占用的那个显卡进行计 算,显卡利用率在30%左右。